package svgbrowser;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 * Componente que muestra la vista de resumen de un componente.
 * @author Jorge Berjano
 */
public class ComponenteMiniatura extends JPanel implements Actualizable {
    private String nombreArchivo;
    private Image imagen;
    private boolean actualizado;
    private Timer temporizador;
    private JLabel etiquetaEspera;
    
    private VisorImagen visorImagen;
    

    public ComponenteMiniatura() {
    }
    
    @Override
    public void finalize() {
       // removeAll();
    }
    
    public String getNombreArchivo() {
        return nombreArchivo;
    }

    public void setNombreArchivo(String nombreArchivo) {
        this.nombreArchivo = nombreArchivo;
        if (nombreArchivo != null && nombreArchivo.length() > 0)
            inicializar();
    }
    
    private void inicializar() {
        visorImagen = new VisorImagen();
        setLayout(new BorderLayout());
        add(visorImagen, BorderLayout.CENTER);
        
        JLabel etiquetaNombre = new JLabel(new File(nombreArchivo).getName());
        etiquetaNombre.setHorizontalAlignment(JLabel.CENTER);
        add(etiquetaNombre, BorderLayout.SOUTH);

        temporizador = new Timer(100, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (isActualizado()) {
                    temporizador.stop();
                    if (getImagen() == null) {
                        etiquetaEspera.setIcon(null);
                        etiquetaEspera.setText("Vista previa no disponible");
                        setBackground(Color.WHITE);
                    } else {
                        
                        visorImagen.setImagen(getImagen());
                        visorImagen.validate();
                        visorImagen.repaint();
                    }
                    validate();
                    repaint();
                }
            }
        });
        temporizador.start();
    }

    synchronized public void actualizar() {
        try {
            FactoriaVisorSVG factoria = new FactoriaVisorSVG(nombreArchivo);
            Image imagenCreada = factoria.getImagen(100, 100);
            if (imagenCreada != null) {
                setImagen(imagenCreada);
            }
            setActualizado(true);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private synchronized Image getImagen() {
        return imagen;
    }

    private synchronized void setImagen(Image imagen) {
        this.imagen = imagen;
    }

    private synchronized boolean isActualizado() {
        return actualizado;
    }

    private synchronized void setActualizado(boolean actualizado) {
        this.actualizado = actualizado;
    }
}
